#include<vector>
#include<unordered_map>
using namespace std;


class Solution {
public:
    int totalFruit(vector<int>& tree) {
        if (tree.size() <= 2) return tree.size();
        int start = 0, end = 0;
        unordered_map<int, int>map;
        for (end = 0; end < tree.size(); ++end) {
            ++map[tree[end]];
            if (map.size() > 2) {
                --map[tree[start]];
                if (map[tree[start]] == 0)
                    map.erase(tree[start]);
                ++start;
            }
        }
        return end - start;
    }
};

//class Solution {
//public:
//    int totalFruit(vector<int>& tree) {
//        if (tree.size() <= 2) return tree.size();
//        int types = 0;
//        unordered_map<int, int>map;
//        int start = 0, end = 0;
//        while (end < tree.size()) {
//            do {
//                if (map[tree[end]] == 0)
//                    ++types;
//                ++map[tree[end]];
//                ++end;
//            } while (end < tree.size() && types <= 2);
//
//            if (types > 2) {
//                --map[tree[start]];
//                if (map[tree[start]] == 0) 
//                    --types;
//                ++start;
//            }
//        }
//        return end - start;
//    }
//};

//int main() {
//    vector<int> tree = { 1,2,1 };
//    Solution sol;
//    sol.totalFruit(tree);
//}